import fiscal
import utiles
import consultasBD
from decimal import Decimal

tipodoc = {'CUIT':'C', 'CUIL':'L', 'LE':'0', 'LC':'1', 'DNI':'2', 'Pasaporte':'3', 'CI':'4' }
responsabilidad = { 'Inscripto':'I', 'Cons. Final':'C', 'Monotributo':'M', 'Cons. Fiscal':'C' }

def quitandoCaracteresRaros(cadena):
    nueva = ""
    for caracter in cadena: #texto con numeros, espacios, comas, guiones, puntos
        if (ord(caracter) not in range(65,91)) and \
           (ord(caracter) not in range(97,123)) and \
           (ord(caracter) not in range(48,58)) and \
           (caracter not in ["."," ","-",",","$"]):
                nueva += " "
        else:
            nueva += caracter
    return str(nueva)

#********************************************************************************************

def ticketModista(lista):
    utiles.logOperaciones("Documento NO fiscal -> Iniciando impresion Ticket Modista")
    listaAux = []
    for renglon in lista:
        listaAux.append(quitandoCaracteresRaros(str(renglon)))
    estado = fiscal.impresionNoFiscal(listaAux)
    utiles.logOperaciones("Documento NO fiscal -> Finalizando impresion Ticket Modista")
    if not estado: raise PrintError()

#********************************************************************************************

def imprimirDetalle(lista):
    #Aqui se envia a la impresora.
    utiles.logOperaciones("Documento NO fiscal -> Impresion iniciada")
    listaAux = []
    for renglon in lista:
        listaAux.append(quitandoCaracteresRaros(str(renglon)))
    estado = fiscal.impresionNoFiscal(listaAux)
    if not estado: raise PrintError()
    utiles.logOperaciones("Documento NO fiscal -> Impresion finalizada")
    print listaAux

#********************************************************************************************

def imprimeFacturaA(datosCliente,grillaVenta,grillaPagos,listaTotalizadores,listaPie):

    print "IMPRIMIENTO TICKET A"
    utiles.logOperaciones("IMPRIMIENTO TICKET A")
    estado = True

    #nrofactura = fiscal.getUltimoA()
    nrofactura = utiles.obtenerNumeroVentaA(utiles.getSucursalActiva())
    print "NUMERO DE COMPROBANTE ",nrofactura
    utiles.logOperaciones("NUMERO DE COMPROBANTE "+str(nrofactura))
    if nrofactura < 0: raise PrintError()

    fiscal.setTrailer(listaPie)

    #GENERANDO E IMPRIMIENDO ENCABEZADO TICKET A

    Tipo = 'A'
    Estacion = 'T'

    nombre = quitandoCaracteresRaros(str(datosCliente['nombre'][:30]))
    nrodoc = quitandoCaracteresRaros(str(datosCliente['nrodoc']))
    respon = str(responsabilidad[datosCliente['situacionfiscal']])
    tipod  = str(tipodoc[datosCliente['tipodoc']])
    domici = quitandoCaracteresRaros(str(datosCliente['direccion']))

    DatosCliente = [nombre,nrodoc,respon,tipod,domici]

    sql = "SELECT hasar_parametroCliente FROM parametros WHERE sucursal = '%s'" % (utiles.getSucursalActiva())
    parametro = consultasBD.ordenCrudaDict(sql)[0]['hasar_parametroCliente']
    
    #IMPRIMIENDO EN LA IMPRESORA FISCAL
    estado = fiscal.abrirDocFiscal(tipo = Tipo, estacion = Estacion, datosCliente = DatosCliente, parametro = parametro)
    utiles.logOperaciones("Datos cliente:\n%s %s\n%s" % (str(Tipo),str(Estacion),str(DatosCliente)))
    if not estado: raise PrintError()
    utiles.logOperaciones("Documento fiscal -> Documento Abierto")
    
     
    #GENERANDO E IMPRIMIENDO DETALLE DE LA VENTA
    
    totFilas = grillaVenta.GetNumberRows()
    totalFactura = Decimal("0.00")
    
    for fil in xrange(totFilas):
        if grillaVenta.GetCellValue(fil,0) == "":
            continue
        
        descripcion1 = quitandoCaracteresRaros(str(grillaVenta.GetCellValue(fil,2)))
        descripcion2 = quitandoCaracteresRaros(str("PTC: "+grillaVenta.GetCellValue(fil,0)))
        TextoFiscal = [descripcion1,descripcion2]
        
        descripcion = quitandoCaracteresRaros(str("Codigo: %s T: %s C: %s" % (grillaVenta.GetCellValue(fil,1),grillaVenta.GetCellValue(fil,3),grillaVenta.GetCellValue(fil,4))))
        cantidad = Decimal(str(grillaVenta.GetCellValue(fil,5)))
        
        x=Decimal("1.21") #para sacar el precio del item sin iva
        preciounitario = ((Decimal(str(grillaVenta.GetCellValue(fil,7))) / cantidad) / x)
        totalFactura = totalFactura + Decimal(str(grillaVenta.GetCellValue(fil,9)))

        tasaiva = Decimal("21.00")
        operacion = 'M'
        if cantidad < Decimal("0.00"): operacion = 'm'
        coefimp = str(Decimal("0.00"))
        DatosProducto = [descripcion,"%0.02f" % cantidad,"%0.02f" % preciounitario,str(tasaiva),operacion,coefimp]
        
        bonificacion = Decimal(str(grillaVenta.GetCellValue(fil,7)))-Decimal(str(grillaVenta.GetCellValue(fil,9)))
        bonificacion = bonificacion / ( tasaiva / Decimal("100.00") + Decimal("1.00"))
        if bonificacion > Decimal("0.00"):
            descripcion = "Bonificacion"
            operacion = 'm'
            #BonificacionProducto = [descripcion,"%0.02f" % bonificacion,tasaiva,operacion,coefimp,Tipo]
            BonificacionProducto = [descripcion,"%0.02f" % bonificacion,operacion]
        elif bonificacion < Decimal("0.00"):
            descripcion = "Recargo"
            operacion = 'M'
            #BonificacionProducto = [descripcion,"%0.02f" % bonificacion,tasaiva,operacion,coefimp,Tipo]
            BonificacionProducto = [descripcion,"%0.02f" % bonificacion,operacion]
        else:
            BonificacionProducto = None

        #IMPRIMIENDO EN LA IMPRESORA FISCAL
        estado = fiscal.imprimirDocFiscalDetalle( textoFiscal = TextoFiscal, datosProducto = DatosProducto, bonificacionProducto = BonificacionProducto )
        print TextoFiscal,DatosProducto,BonificacionProducto
        utiles.logOperaciones("Datos items:\n%s\n%s\n%s" % (str(TextoFiscal),str(DatosProducto),str(BonificacionProducto)))
        if not estado: raise PrintError()
        utiles.logOperaciones("Documento fiscal -> Detalle impreso")

    #GENERANDO E IMPRIMIENDO EL PIE DEL TICKET - FINALIZANDO LA VENTA
    
    #listaTotalizadores contiene: [ %descuento, iva, total sin iva, total con iva]
    
    
    #descuentoGeneral = totalFactura - listaTotalizadores[3] - listaTotalizadores[1]
    descuentoGeneral = totalFactura - listaTotalizadores[3]
    if descuentoGeneral == Decimal("0.00"):
        DescuentoRecargo = None
    elif descuentoGeneral > Decimal("0.00"):
        descripcion = "DESCUENTO VENTA"
        calificador = 'm'
        DescuentoRecargo = [descripcion,"%0.02f" % descuentoGeneral,calificador]
    else:
        descripcion = "RECARGO VENTA"
        calificador = 'M'
        DescuentoRecargo = [descripcion,"%0.02f" % descuentoGeneral,calificador]

    totFilas = grillaPagos.GetNumberRows()
    DetallePagos = []
    for fil in xrange(totFilas):
        if grillaPagos.GetCellValue(fil,0) == "":
            continue
        descripcion = quitandoCaracteresRaros(str(grillaPagos.GetCellValue(fil,1)))
        monto = str(grillaPagos.GetCellValue(fil,4))
        totalizador = 'T'
        DetallePagos.append([descripcion,monto,totalizador])

    #IMPRIMIENDO EN LA IMPRESORA FISCAL
    estado = fiscal.cerrarDocFiscal(descuentoRecargo = DescuentoRecargo, detallePagos = DetallePagos)
    print DescuentoRecargo, DetallePagos
    utiles.logOperaciones("Datos cierre:\n%s\n%s" % (str(DescuentoRecargo), str(DetallePagos)))
    if not estado: raise PrintError()
    utiles.logOperaciones("Documento fiscal -> Documento cerrado")

    fiscal.setTrailer()
   
    return 1

#********************************************************************************************

def imprimeFacturaB(datosCliente,grillaVenta,grillaPagos,listaTotalizadores,listaPie):

    print "IMPRIMIENTO TICKET B"
    utiles.logOperaciones("IMPRIMIENTO TICKET B")
    estado = True

    #nrofactura = fiscal.getUltimoBC()
    nrofactura = utiles.obtenerNumeroVentaB(utiles.getSucursalActiva())
    print "NUMERO DE COMPROBANTE ",nrofactura
    utiles.logOperaciones("NUMERO DE COMPROBANTE "+str(nrofactura))
    if nrofactura < 0: raise PrintError()
    
    fiscal.setTrailer(listaPie)

    #GENERANDO E IMPRIMIENDO ENCABEZADO TICKET BC

    Tipo = 'B'
    Estacion = 'T'

    nombre = quitandoCaracteresRaros(str(datosCliente['nombre'][:30]))
    nrodoc = quitandoCaracteresRaros(str(datosCliente['nrodoc']))
    respon = str(responsabilidad[datosCliente['situacionfiscal']])
    tipod  = str(tipodoc[datosCliente['tipodoc']])
    domici = quitandoCaracteresRaros(str(datosCliente['direccion']))

    DatosCliente = [nombre,nrodoc,respon,tipod,domici]

    sql = "SELECT hasar_parametroCliente FROM parametros WHERE sucursal = '%s'" % (utiles.getSucursalActiva())
    parametro = consultasBD.ordenCrudaDict(sql)[0]['hasar_parametroCliente']
    
    #IMPRIMIENDO EN LA IMPRESORA FISCAL
    estado = fiscal.abrirDocFiscal(tipo = Tipo, estacion = Estacion, datosCliente = DatosCliente, parametro = parametro)
    print Tipo,Estacion,DatosCliente
    utiles.logOperaciones("Datos cliente:\n%s %s\n%s" % (str(Tipo),str(Estacion),str(DatosCliente)))
    if not estado: raise PrintError()
    utiles.logOperaciones("Documento fiscal -> Documento Abierto")
        
    #GENERANDO E IMPRIMIENDO DETALLE DE LA VENTA
    
    totFilas = grillaVenta.GetNumberRows()
    totalFactura = Decimal("0.00")
    
    for fil in xrange(totFilas):
        if grillaVenta.GetCellValue(fil,0) == "":
            continue
        
        descripcion1 = quitandoCaracteresRaros(str(grillaVenta.GetCellValue(fil,2)))
        descripcion2 = quitandoCaracteresRaros(str("PTC: "+grillaVenta.GetCellValue(fil,0)))
        TextoFiscal = [descripcion1,descripcion2]
        
        descripcion = quitandoCaracteresRaros(str("Codigo: %s T: %s C: %s" % (grillaVenta.GetCellValue(fil,1),grillaVenta.GetCellValue(fil,3),grillaVenta.GetCellValue(fil,4))))
        cantidad = Decimal(str(grillaVenta.GetCellValue(fil,5)))
        
        #x=Decimal("1.21") #para sacar el precio del item sin iva
        preciounitario = abs(Decimal(str(grillaVenta.GetCellValue(fil,7))) / cantidad)
        totalFactura = totalFactura + Decimal(str(grillaVenta.GetCellValue(fil,9)))
        
        tasaiva = str(Decimal("21.00"))
        operacion = 'M'
        if cantidad < Decimal("0.00"): 
            operacion = 'm'
            cantidad = abs(cantidad)
        coefimp = str(Decimal("0.00"))
        DatosProducto = [descripcion,"%0.02f" % cantidad,"%0.02f" % preciounitario,tasaiva,operacion,coefimp]
        
        bonificacion = Decimal(str(grillaVenta.GetCellValue(fil,7)))-Decimal(str(grillaVenta.GetCellValue(fil,9)))
        if bonificacion > Decimal("0.00"):
            descripcion = "Bonificacion"
            operacion = 'm'
            BonificacionProducto = [descripcion,"%0.02f" % bonificacion,operacion,Tipo]
        elif bonificacion < Decimal("0.00"):
            bonificacion = abs(bonificacion)
            descripcion = "Recargo"
            operacion = 'M'
            BonificacionProducto = [descripcion,"%0.02f" % bonificacion,operacion,Tipo]
        else:
            if Decimal(str(grillaVenta.GetCellValue(fil,7)))<Decimal("0.00"):
                print "-> Calculando devolucion como bonificacion"
                bonificacion = abs(Decimal(str(grillaVenta.GetCellValue(fil,7))))
                descripcion = "Bonificacion"
                operacion = 'm'
                BonificacionProducto = [descripcion,"%0.02f" % bonificacion,operacion,Tipo]
            else:
                BonificacionProducto = None
            BonificacionProducto = None

        #IMPRIMIENDO EN LA IMPRESORA FISCAL
        estado = fiscal.imprimirDocFiscalDetalle( textoFiscal = TextoFiscal, datosProducto = DatosProducto, bonificacionProducto = BonificacionProducto , totalizador = 'T' )
        print TextoFiscal,DatosProducto,BonificacionProducto
        utiles.logOperaciones("Datos items:\n%s\n%s\n%s" % (str(TextoFiscal),str(DatosProducto),str(BonificacionProducto)))
        if not estado: raise PrintError()
        utiles.logOperaciones("Documento fiscal -> Detalle impreso")

    #GENERANDO E IMPRIMIENDO EL PIE DEL TICKET - FINALIZANDO LA VENTA
    
    #listaTotalizadores contiene: [%descuento,iva,total sin iva,total con iva]

    descuentoGeneral = totalFactura - listaTotalizadores[3]
    if descuentoGeneral == Decimal("0.00"):
        DescuentoRecargo = None
    elif descuentoGeneral > Decimal("0.00"):
        descripcion = "DESCUENTO VENTA"
        calificador = 'm'
        DescuentoRecargo = [descripcion,"%0.02f" % descuentoGeneral,calificador]
    else:
        descripcion = "RECARGO VENTA"
        calificador = 'M'
        DescuentoRecargo = [descripcion,"%0.02f" % descuentoGeneral,calificador]

    totFilas = grillaPagos.GetNumberRows()
    DetallePagos = []
    for fil in xrange(totFilas):
        if grillaPagos.GetCellValue(fil,0) == "":
            continue
        descripcion = quitandoCaracteresRaros(str(grillaPagos.GetCellValue(fil,1)))
        monto = str(grillaPagos.GetCellValue(fil,4))
        totalizador = 'T'
        
        DetallePagos.append([descripcion,monto,totalizador])

    #IMPRIMIENDO EN LA IMPRESORA FISCAL
    estado = fiscal.cerrarDocFiscal(descuentoRecargo = DescuentoRecargo, detallePagos = DetallePagos , totalizador = 'T')
    print DescuentoRecargo, DetallePagos
    utiles.logOperaciones("Datos cierre:\n%s\n%s" % (str(DescuentoRecargo), str(DetallePagos)))
    if not estado: raise PrintError()
    utiles.logOperaciones("Documento fiscal -> Documento cerrado")
    
    fiscal.setTrailer()

    return 1

#********************************************************************************************

def imprimeNotaCreditoA(datosCliente,grillaVenta,grillaPagos,listaTotalizadores,listaPie):

    print "IMPRIMIENTO NOTA DE CREDITO A"

    utiles.logOperaciones("IMPRIMIENTO NOTA DE CREDITO A")
    estado = True

    #nrofactura = fiscal.getUltimoA()
    nrofactura = utiles.obtenerNumeroVentaA(utiles.getSucursalActiva())
    print "NUMERO DE COMPROBANTE ",nrofactura
    utiles.logOperaciones("NUMERO DE COMPROBANTE "+str(nrofactura))
    if nrofactura < 0: raise PrintError()

    fiscal.setTrailer(listaPie)

    #GENERANDO E IMPRIMIENDO ENCABEZADO TICKET A

    Tipo = 'R'
    Estacion = 'T'

    nombre = quitandoCaracteresRaros(str(datosCliente['nombre'][:30]))
    nrodoc = quitandoCaracteresRaros(str(datosCliente['nrodoc']))
    respon = str(responsabilidad[datosCliente['situacionfiscal']])
    tipod  = str(tipodoc[datosCliente['tipodoc']])
    if str(datosCliente['direccion']) == '':
        domici = 'no informado'
    else:
        domici = quitandoCaracteresRaros(str(datosCliente['direccion']))

    DatosCliente = [nombre,nrodoc,respon,tipod,domici]

    sql = "SELECT hasar_parametroCliente FROM parametros WHERE sucursal = '%s'" % (utiles.getSucursalActiva())
    parametro = consultasBD.ordenCrudaDict(sql)[0]['hasar_parametroCliente']
    
    #IMPRIMIENDO EN LA IMPRESORA FISCAL
    fiscal.informarDocumento("1") #se informa un nro de doc cualquiera sobre la NC que hay que hacer
    estado = fiscal.abrirDocFiscal(tipo = Tipo, estacion = Estacion, datosCliente = DatosCliente, parametro = parametro, noFiscal = True)
    print Tipo,Estacion,DatosCliente
    utiles.logOperaciones("Datos cliente:\n%s %s\n%s" % (str(Tipo),str(Estacion),str(DatosCliente)))
    if not estado: raise PrintError()
    utiles.logOperaciones("Documento NO Fiscal Homologado -> Documento Abierto")
     
    #GENERANDO E IMPRIMIENDO DETALLE DE LA VENTA
    
    totFilas = grillaVenta.GetNumberRows()
    totalFactura = Decimal("0.00")
    
    for fil in xrange(totFilas):
        if grillaVenta.GetCellValue(fil,0) == "":
            continue
        
        descripcion1 = quitandoCaracteresRaros(str(grillaVenta.GetCellValue(fil,2)))
        descripcion2 = quitandoCaracteresRaros(str("PTC: "+grillaVenta.GetCellValue(fil,0)))
        TextoFiscal = [descripcion1,descripcion2]
        
        descripcion = quitandoCaracteresRaros(str("Codigo: %s T: %s C: %s" % (grillaVenta.GetCellValue(fil,1),grillaVenta.GetCellValue(fil,3),grillaVenta.GetCellValue(fil,4))))
        cantidad = abs(Decimal(str(grillaVenta.GetCellValue(fil,5))))
        
        x=Decimal("1.21") #para sacar el precio del item sin iva
        preciounitario = ((Decimal(str(grillaVenta.GetCellValue(fil,7))) / cantidad) / x)
        totalFactura = totalFactura + Decimal(str(grillaVenta.GetCellValue(fil,9)))

        tasaiva = Decimal("21.00")
        print "Operacion --> M"
        operacion = 'M'
            
        coefimp = str(Decimal("0.00"))
        DatosProducto = [descripcion,"%0.02f" % abs(cantidad),"%0.02f" % abs(preciounitario),str(tasaiva),operacion,coefimp]
        
        bonificacion = abs( Decimal(str(grillaVenta.GetCellValue(fil,7)))-Decimal(str(grillaVenta.GetCellValue(fil,9))) )
        bonificacion = bonificacion / ( tasaiva / Decimal("100.00") + Decimal("1.00"))
        if bonificacion > Decimal("0.00"):
            descripcion = "Bonificacion"
            operacion = 'm'
            BonificacionProducto = [descripcion,"%0.02f" % abs(bonificacion),operacion]
        else:
            BonificacionProducto = None

        #IMPRIMIENDO EN LA IMPRESORA FISCAL
        estado = fiscal.imprimirDocFiscalDetalle( textoFiscal = TextoFiscal, datosProducto = DatosProducto, bonificacionProducto = BonificacionProducto )
        print TextoFiscal,DatosProducto,BonificacionProducto
        utiles.logOperaciones("Datos items:\n%s\n%s\n%s" % (str(TextoFiscal),str(DatosProducto),str(BonificacionProducto)))
        if not estado: raise PrintError()
        utiles.logOperaciones("Documento fiscal -> Detalle impreso")

    #GENERANDO E IMPRIMIENDO EL PIE DEL TICKET - FINALIZANDO LA VENTA
    
    #listaTotalizadores contiene: [ %descuento, iva, total sin iva, total con iva]
    
    #descuentoGeneral = totalFactura - listaTotalizadores[3] - listaTotalizadores[1]
    descuentoGeneral = abs( totalFactura - listaTotalizadores[3] )
    if descuentoGeneral > Decimal("0.00"):
        descripcion = "DESCUENTO VENTA"
        calificador = 'm'
        DescuentoRecargo = [descripcion,"%0.02f" % abs(descuentoGeneral),calificador]
    else:
        DescuentoRecargo = None

    totFilas = grillaPagos.GetNumberRows()
    DetallePagos = []
    for fil in xrange(totFilas):
        if grillaPagos.GetCellValue(fil,0) == "":
            continue
        descripcion = quitandoCaracteresRaros(str(grillaPagos.GetCellValue(fil,1)))
        monto = str(grillaPagos.GetCellValue(fil,4))
        totalizador = 'T'
        DetallePagos.append([descripcion,monto,totalizador])

    #IMPRIMIENDO EN LA IMPRESORA FISCAL NOTA DE CREDITO
    estado = fiscal.cerrarDocFiscal(descuentoRecargo = DescuentoRecargo, detallePagos = DetallePagos, noFiscal = True)
    print DescuentoRecargo, DetallePagos
    utiles.logOperaciones("Datos cierre:\n%s\n%s" % (str(DescuentoRecargo), str(DetallePagos)))
    if not estado: raise PrintError()
    utiles.logOperaciones("Documento fiscal -> Documento cerrado")

    fiscal.setTrailer()
   
    return 1

def imprimeNotaCreditoB(datosCliente,grillaVenta,grillaPagos,listaTotalizadores,listaPie):

    print "IMPRIMIENTO NOTA DE CREDITO B"
        
    utiles.logOperaciones("IMPRIMIENTO NOTA DE CREDITO B")
    estado = True

    #nrofactura = fiscal.getUltimoBC()
    nrofactura = utiles.obtenerNumeroVentaB(utiles.getSucursalActiva())
    print "NUMERO DE COMPROBANTE ",nrofactura
    utiles.logOperaciones("NUMERO DE COMPROBANTE "+str(nrofactura))
    if nrofactura < 0: raise PrintError()
    
    fiscal.setTrailer(listaPie)

    #GENERANDO E IMPRIMIENDO ENCABEZADO TICKET BC

    Tipo = 'S'
    Estacion = 'T'

    nombre = quitandoCaracteresRaros(str(datosCliente['nombre'][:30]))
    nrodoc = quitandoCaracteresRaros(str(datosCliente['nrodoc']))
    respon = str(responsabilidad[datosCliente['situacionfiscal']])
    tipod  = str(tipodoc[datosCliente['tipodoc']])
    if str(datosCliente['direccion']) == '':
        domici = 'no informado'
    else:
        domici = quitandoCaracteresRaros(str(datosCliente['direccion']))

    DatosCliente = [nombre,nrodoc,respon,tipod,domici]

    sql = "SELECT hasar_parametroCliente FROM parametros WHERE sucursal = '%s'" % (utiles.getSucursalActiva())
    parametro = consultasBD.ordenCrudaDict(sql)[0]['hasar_parametroCliente']
    
    #IMPRIMIENDO EN LA IMPRESORA FISCAL
    fiscal.informarDocumento("1") #se informa un nro de doc cualquiera sobre la NC que hay que hacer
    estado = fiscal.abrirDocFiscal(tipo = Tipo, estacion = Estacion, datosCliente = DatosCliente, parametro = parametro, noFiscal = True)
    print Tipo,Estacion,DatosCliente
    utiles.logOperaciones("Datos cliente:\n%s %s\n%s" % (str(Tipo),str(Estacion),str(DatosCliente)))
    if not estado: raise PrintError()
    utiles.logOperaciones("Documento fiscal -> Documento Abierto")
        
    #GENERANDO E IMPRIMIENDO DETALLE DE LA VENTA
    
    totFilas = grillaVenta.GetNumberRows()
    totalFactura = Decimal("0.00")
    
    for fil in xrange(totFilas):
        if grillaVenta.GetCellValue(fil,0) == "":
            continue
        
        descripcion1 = quitandoCaracteresRaros(str(grillaVenta.GetCellValue(fil,2)))
        descripcion2 = quitandoCaracteresRaros(str("PTC: "+grillaVenta.GetCellValue(fil,0)))
        TextoFiscal = [descripcion1,descripcion2]
        
        descripcion = quitandoCaracteresRaros(str("Codigo: %s T: %s C: %s" % (grillaVenta.GetCellValue(fil,1),grillaVenta.GetCellValue(fil,3),grillaVenta.GetCellValue(fil,4))))
        cantidad = abs(Decimal(str(grillaVenta.GetCellValue(fil,5))))
        
        #x=Decimal("1.21") #para sacar el precio del item sin iva
        preciounitario = abs(Decimal(str(grillaVenta.GetCellValue(fil,7))) / cantidad)
        totalFactura = totalFactura + Decimal(str(grillaVenta.GetCellValue(fil,9)))
        
        tasaiva = str(Decimal("21.00"))
        print "Operacion --> M"
        operacion = 'M'

        coefimp = str(Decimal("0.00"))
        DatosProducto = [descripcion,"%0.02f" % abs(cantidad),"%0.02f" % abs(preciounitario),tasaiva,operacion,coefimp]
        
        bonificacion = abs( Decimal(str(grillaVenta.GetCellValue(fil,7)))-Decimal(str(grillaVenta.GetCellValue(fil,9))) )
        if bonificacion > Decimal("0.00"):
            descripcion = "Bonificacion"
            operacion = 'm'
            BonificacionProducto = [descripcion,"%0.02f" % abs(bonificacion),operacion,Tipo]
        else:
            BonificacionProducto = None

        #IMPRIMIENDO EN LA IMPRESORA FISCAL
        estado = fiscal.imprimirDocFiscalDetalle( textoFiscal = TextoFiscal, datosProducto = DatosProducto, bonificacionProducto = BonificacionProducto , totalizador = 'T' )
        print TextoFiscal,DatosProducto,BonificacionProducto
        utiles.logOperaciones("Datos items:\n%s\n%s\n%s" % (str(TextoFiscal),str(DatosProducto),str(BonificacionProducto)))
        if not estado: raise PrintError()
        utiles.logOperaciones("Documento fiscal -> Detalle impreso")

    #GENERANDO E IMPRIMIENDO EL PIE DEL TICKET - FINALIZANDO LA VENTA
    
    #listaTotalizadores contiene: [%descuento,iva,total sin iva,total con iva]

    descuentoGeneral = abs( totalFactura - listaTotalizadores[3] )
    if descuentoGeneral > Decimal("0.00"):
        descripcion = "DESCUENTO VENTA"
        calificador = 'm'
        DescuentoRecargo = [descripcion,"%0.02f" % descuentoGeneral,calificador]
    else:
        DescuentoRecargo = None

    totFilas = grillaPagos.GetNumberRows()
    DetallePagos = []
    for fil in xrange(totFilas):
        if grillaPagos.GetCellValue(fil,0) == "":
            continue
        descripcion = quitandoCaracteresRaros(str(grillaPagos.GetCellValue(fil,1)))
        monto = str(grillaPagos.GetCellValue(fil,4))
        totalizador = 'T'
        
        DetallePagos.append([descripcion,monto,totalizador])

    #IMPRIMIENDO EN LA IMPRESORA FISCAL
    estado = fiscal.cerrarDocFiscal(descuentoRecargo = DescuentoRecargo, detallePagos = DetallePagos , totalizador = 'T', noFiscal = True)
    print DescuentoRecargo, DetallePagos
    utiles.logOperaciones("Datos cierre:\n%s\n%s" % (str(DescuentoRecargo), str(DetallePagos)))
    if not estado: raise PrintError()
    utiles.logOperaciones("Documento fiscal -> Documento cerrado")
    
    fiscal.setTrailer()

    return 1


#********************************************************************************************


class PrintError(Exception):
    pass
    
if __name__ == '__main__':
    pass
    